grammar IMP;
options
{
	backtrack = true;
	output = AST;
}

id 	: ID 
	;
intR 	: INT 
	;
simpleE : id
	| intR
	;
		
aExp  	: simpleE '+'  aExp
	| simpleE '/' aExp
	| simpleE
	;

bool 	: BOOL
	;
bExp 	: simpleE '<=' simpleE
	| bool
	;

cbExp : bExp 'and' bExp
	|  'not' bExp
	| bExp
	;

stmts 	: stmt ';' stmts
	| stmt ';' 
 	;

stmt :
	| id ':=' aExp
	| 'if' cbExp 'then' '(' stmts ')' 'else' '(' stmts ')'
	| 'while' cbExp 'do' '(' stmts ')'
	;

pgm 	: 'var' ids ';' stmts
	;

ids 	: id ',' ids
	|  id
	;

BOOL : 'true'
	| 'false'
	;

ID  : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ;

INT	: '-'?('0'|'1'..'9')('0'..'9')*
	;

WS  :  (' ' | '\t' | '\r' | '\n')+ {$channel=HIDDEN;}
    ;
   
